2
תגובות
הקוד הבא:
function MyConstructor() {}
var myobject = new MyConstructor();
alert(myobject.constructor == MyConstructor);

מחזיר, כצפוי, true.
לעומת זאת, הקוד הבא:
function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();
alert(myobject.constructor == MyConstructor);
alert(myobject.constructor);

מקפיץ false ואחר כך את הפונקציה Object (כלומר שהבנאי של myobject הוא Object).


לקחתי את זה מכאן: http://joost.zeekat.nl/constructors-considered-mildly-confusing.html.
קראתי את המאמר, הבנתי את העניין של אבי הטיפוס של האובייקטים ושהם בעצם שווים למאפיין prototype של פונקצית הבנאי שלהם.
אבל בכל זאת לא הבנתי למה הבנאי של myobject הוא הפונקציה Object בקוד למעלה.


תודה מראש.

2 תשובות

avatar ענה iiddaannyy ב 02 ליולי 2012 #

לא חשוב, הבנתי.
כל מה שהיה חסר לי כדי להבין זה שהמאפיין constructor לא שייך ל-myobject, אלא ל-MyConstructor.prototype (זה מוגדר באופן אוטומטי כשיוצרים את הפונקציה MyConstructor).
מה שקורה בקוד הראשון זה שהמערכת מחפשת את המאפיין constructor באובייקט myobject ולא מוצאת אותו, אז היא הולכת לאב טיפוס שלו שהוא בעצם MyConstructor.prototype ומוצאת אותו שם.

בקוד השני שינינו את MyConstructor.prototype לאובייקט ריק, שלא מכיל את המאפיין contructor.
כשאנחנו מחפשים את constructor בתוך myobject המערכת מחפשת את המאפיין constructor בתוך myobject, לא מוצאת ועוברת לאב טיפוס, MyConstructor.prototype, גם שם היא לא מוצאת ואז היא עוברת לאב טיפוס של myConstructor.prototype (שהרי הגדרנו אותו כאובייקט ריק), שהוא Object.prototype, ומוצאת שם את constructor שבעצם מפנה לפונקציה Object.

avatar ענה iiddaannyy ב 02 ליולי 2012 #

שאלה חדשה:
ב-javascript יש פונקציה בשם Function שבעצם יצירת מופע שלה מחזירה פונקציה. זאת אומרת:

var myfunc = new Function('arg1','arg2','return arg1+arg2');

במקרה הזה המשתנה myfunc מכיל פונקציה שמקבלת 2 פרמטרים ומחזירה את הסכום שלהם.

השאלה שלי היא - איך יכול להית שגם Function היא פונקציה? איך יכול להיות שהיא מופע של עצמה?
וגם Object הוא פונקציה, כלומר מופע של Function אבל בעצם Function היא מופע של Object (כי פונקציה היא אובייקט).
איך זה יכול להיות? זו רוקורסיה אינסופית.. :S

עריכה - קיבלתי תשובה.